﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.Data.Sql;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Ventas
{
    public class GetDocumentoVentaList
    {
        int _count;



        public int Count(int idProyecto, string clienteStr, string tipoDocumentoStr,
                            string monedaStr,string numDocumentoStr,
                            string estadoStr,
                            DateTime fechaInicio, DateTime fechaFin,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            return _count;
        }



        public int Count(string idOrdenVenta,
                         int startRowIndex,
                         int maximumRows,
                         string sortExpression)
        {
            return _count;
        }
        public int Count(int    idCliente,
                       int startRowIndex,
                       int maximumRows,
                       string sortExpression)
        {
            return _count;
        }



        private IQueryable<DocumentoVentaListInfo> ApplySelect_ListInfo()
        {
            DAL.Menu documentoVentaRead = DbUtil.Db.Menus.Single(p => p.idInternal == 124);

            var q = from a in DbUtil.Db.DocumentoVentas
                    select new DocumentoVentaListInfo
                    {
                        bitAfecto=a.bitAfecto,
                        comentario=a.comentario,
                        documentoTipoStr=a.DocumentoTipo.descripcion,
                        idTipoDocumento=a.idDocumentoTipo,
                        fecha=a.fecha,
                        fechaStr=a.fecha.ToShortDateString(),
                        idCliente=a.idCliente,
                        idInternal=a.idInternal,
                        idOrdenVentaItem = a.idOrdenVentaItem,
                        IGVTotal=a.IGVTotal,
                        monedaStr=a.Moneda.simbol,
                        nombreCliente=a.nombreCliente,
                        numeroDoc=a.numeroDoc,
                        numeroDocStr = string.Format("{0}/{1}-{2}", a.DocumentoTipo.abreviacion, a.serie, a.numeroDoc),
                        UI = a.OrdenVentaItem.UI.descripcion,
                         localizacion=a.OrdenVentaItem.UI.UILocalizacion.descripcion,
                          
                        SubTotal=a.SubTotal,
                        tipoCambio=a.tipoCambio,
                        total=a.total,
                        IGVTotalStr=string.Format("{0}{1:N}",a.Moneda.simbol,a.IGVTotal),
                        SubTotalStr= string.Format("{0}{1:N}", a.Moneda.simbol, a.SubTotal),
                        totalStr = string.Format("{0}{1:N}", a.Moneda.simbol, a.total),
                        idProyecto=a.idProyecto,
                        bitAnulado = a.bitAnulado,
                        idEstado=a.idEstado,
                        idMoneda=a.idMoneda,
                        estadoStr=a.EstadoItem.descripcion,
                        idOrdenVenta=a.OrdenVentaItem.idOrdenVenta,
                        //loadTabFromForm('TAB','TITULO TAB','Formulario')
                        //----------TAB-> tab(idpplicacion-id)
                        formulario = string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idProyecto={1}');",
                               documentoVentaRead.idAplicacion,
                               a.idProyecto,
                               a.Proyecto.descripcion,
                               documentoVentaRead.url,
                               a.idInternal),
                        //-------------------------------
                        
                         
                    };
            return q;
        }
        private IQueryable<DocumentoVentaListInfo> ApplySort(IQueryable<DocumentoVentaListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "comentario":
                    q = q.OrderBy(b => b.comentario);
                    break;
                case "comentario DESC":
                    q = q.OrderByDescending(b => b.comentario);
                    break;


                case "estadoStr":
                    q = q.OrderBy(b => b.estadoStr);
                    break;
                case "estadoStr DESC":
                    q = q.OrderByDescending(b => b.estadoStr);
                    break;

                case "numeroDoc":
                    q = q.OrderBy(b => b.numeroDoc);
                    break;
                case "numeroDoc DESC":
                    q = q.OrderByDescending(b => b.numeroDoc);
                    break;

                case "bitAfecto":
                    q = q.OrderBy(b => b.bitAfecto);
                    break;
                case "bitAfecto DESC":
                    q = q.OrderByDescending(b => b.bitAfecto);
                    break;

               

                case "documentoTipoStr":
                    q = q.OrderBy(b => b.documentoTipoStr);
                    break;
                case "documentoTipoStr DESC":
                    q = q.OrderByDescending(b => b.documentoTipoStr);
                    break;


                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;


                case "IGVTotal":
                    q = q.OrderBy(b => b.IGVTotal);
                    break;
                case "IGVTotal DESC":
                    q = q.OrderByDescending(b => b.IGVTotal);
                    break;

                case "monedaStr":
                    q = q.OrderBy(b => b.monedaStr);
                    break;
                case "monedaStr DESC":
                    q = q.OrderByDescending(b => b.monedaStr);
                    break;


                case "nombreCliente":
                    q = q.OrderBy(b => b.nombreCliente);
                    break;
                case "nombreCliente DESC":
                    q = q.OrderByDescending(b => b.nombreCliente);
                    break;


                case "UIStr":
                    q = q.OrderBy(b => b.UIStr);
                    break;
                case "UIStr DESC":
                    q = q.OrderByDescending(b => b.UIStr);
                    break;

                case "SubTotal":
                    q = q.OrderBy(b => b.SubTotal);
                    break;
                case "SubTotal DESC":
                    q = q.OrderByDescending(b => b.SubTotal);
                    break;

                case "total":
                    q = q.OrderBy(b => b.total);
                    break;
                case "total DESC":
                    q = q.OrderByDescending(b => b.total);
                    break;

                
                
                default:
                    q = q.OrderByDescending(a => a.idTipoDocumento).OrderByDescending(b => b.fecha).OrderByDescending(p => p.numeroDoc);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<DocumentoVentaListInfo> Execute(int idProyecto, 
                                                            string clienteStr,
                                                            string tipoDocumentoStr,
                                                            string monedaStr, 
                                                            string numDocumentoStr,
                                                            string estadoStr,
                                                            DateTime fechaInicio, DateTime fechaFin,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {




            //if (!numDocumentoStr.HasValue())
            //    numDocumentoStr = "";
            if (!clienteStr.HasValue())
                clienteStr = "";
            if (!numDocumentoStr.HasValue())
                numDocumentoStr = "";

            var q = ApplySelect_ListInfo();


            q = q.Where(a => a.numeroDoc.Contains(numDocumentoStr)
                              & (int.Parse(monedaStr) == 0 ? a.idMoneda != 0 : a.idMoneda == int.Parse(monedaStr))
                              & (int.Parse(tipoDocumentoStr) == 0 ? a.idTipoDocumento != 0 : a.idTipoDocumento == int.Parse(tipoDocumentoStr))
                              & (a.fecha > fechaInicio & a.fecha < fechaFin.AddDays(1))
                              & a.nombreCliente.Contains(clienteStr)
                              & a.idProyecto == idProyecto
                              & (estadoStr == "0" ? a.idEstado != 0 : a.idEstado == Convert.ToInt32(estadoStr)));


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }



         [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<DocumentoVentaListInfo> Execute(string idOrdenVenta,
                                                             int startRowIndex,
                                                             int maximumRows,
                                                             string sortExpression)
        {


            var q = ApplySelect_ListInfo();


            q = q.Where(a => a.idOrdenVenta == idOrdenVenta.ToInt());


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }



         [DataObjectMethod(DataObjectMethodType.Select, false)]
         public IEnumerable<DocumentoVentaListInfo> Execute(int idCliente,
                                                              int startRowIndex,
                                                              int maximumRows,
                                                              string sortExpression)
         {


             var q = ApplySelect_ListInfo();


             q = q.Where(a => a.idCliente== idCliente.ToInt() 
                            & a.bitAnulado==false);


             _count = q.Count();

             q = ApplySort(q, sortExpression);
             return q.Skip(startRowIndex).Take(maximumRows);
         }
               

    }
}
